package com.itheima.tlias08_14.aspect;

import com.alibaba.fastjson.JSONObject;
import com.itheima.tlias08_14.utils.JwtUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class CountTime {

    @Resource
    HttpServletRequest request;

    //"execution(* com.itheima.tlias08_14.service.impl.*.*(..))": 这是一个切入点表达式，用来匹配方法执行的连接点。
    //execution: 关键字，表示这是一个方法执行的连接点。
    //* com.itheima.tlias08_14.service.impl.*.*:
    //第一个 *: 表示返回类型可以是任何类型。
    //com.itheima.tlias08_14.service.impl.*: 匹配 com.itheima.tlias08_14.service.impl 包下的所有类。
    //第二个 *: 表示匹配包下的所有类。
    //第三个 *: 表示匹配这些类中的所有方法。
    //(..): 表示方法可以接受任意数量和类型的参数。
    @Around("execution(* com.itheima.tlias08_14.service.impl.*.*(..))")
    public Object count (ProceedingJoinPoint process){


        //获取请求体中的token
        String token = request.getHeader("token");
        log.info("获取请求头中的token {}",token);
        if(!request.getRequestURI().contains("login")) {
            JSONObject decode = JwtUtil.decode(token);
            log.info("获取请求头中的用户名 {}",decode.getString("username"));
        }
        //获取方法名
        String methodName = process.getSignature().getName();
        log.info("获取方法名 {}",methodName);
        //获取参数
        Object[] args = process.getArgs();
        log.info("获取方法参数 {}",args);
        //获取类名
        String className = process.getTarget().getClass().getName();
        log.info("获取类名 {}",className);
        long start = System.currentTimeMillis();
        //
        try {
            Object proceed = process.proceed();
            long processTime = System.currentTimeMillis() - start ;
            log.info("{}方法执行时间为 processTime = {} s",methodName,processTime / 1000.0);
            return proceed;
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
    }
}
